SVG/Tutorials/Text/animierte Textpfade
Sie können mit SVG mit Hilfe des textPath-Elements sehr einfach Text entlang von Pfaden führen. Dieser Text kann durch eine Verschiebung des Startpunkts zum Lauftext animiert werden.
Inhaltsverzeichnis
textPath
Mit dem textPath-Element können Sie Text entlang eines Pfades ausrichten. Dabei werden die Positionen und Rotationen der einzelnen Zeichen automatisch berechnet.
Das textPath-Element muss innerhalb eines text
-Elements verschachtelt sein und eine ID mit einer Referenz auf den Pfad aufweisen.
Folgende Angaben sind möglich:
x,y
: Positionierungdx,dy
: PositionierunglengthAdjust
: ob nur Zeichenabstand oder auch Zeichen angepasst werden sollentextLength
: Länge des Textshref
: Verlinkung auf den Pfad, an dem der Text ausgerichtet werden soll.path
: Direkte Pfadangabe imtextPath
-Element, statt mit href auf einen Pfad zu verweisen (nur im Firefox-Browser, hat Vorrang vor einer href Angabe)startOffset
: Verschiebung der Start-Positionmethod
: Rendering des Textpfadsspacing
: Setzen von Zeichenabständenside
: legt die Seite fest, auf der der Text dargestellt wirdleft
: Standardwertright
<svg viewbox="0 0 800 500">
<path id="eins" d="M20,140
h100
a100,100 0 0,0 70,-50
a100,100 0 0,1 70,-50
h470
a50,50 1 0,1 50,50
v200"/>
<path id="zwei" d="M20,180
h100
c200,20 300,300 350,200"/>
<path id="drei" d="M600,280
h75 l50,50 v75 l-50,50 h-75 l-50,-50 v-75z"/>
<path id="vier" d="M140,440
a 90,90 1 1,1 50,0"/>
<text>
<textPath class="schreib" xlink:href="#eins">
Es geht langsam aufwärts...
</textPath>
<textPath class="schreib" xlink:href="#zwei">
... und jetzt steil nach unten!
</textPath>
<textPath class="schreib" xlink:href="#eins">
... immer an der Wand lang!
</textPath>
<textPath class="achteck" xlink:href="#drei" method="align">
Ein Textpfad muss nicht immer eine Kurve sein!
</textPath>
</text>
<text>
<tspan class="h1" x="170" y="345" text-anchor="middle">SELF</tspan>
<tspan class="h1" x="170" y="390" text-anchor="middle">HTML</tspan>
<textPath class="schreib" xlink:href="#vier" fill="#dfac20" startOffset="60">
erfolgreich online seit 1995!
</textPath>
</text>
</svg>
Die Textpfade bestehen aus dem Text, der auf den vom id referenzierten Pfad gelegt wird.
Der obere Pfad wird von 2 Texten benutzt; der rechte Text bekommt mit startOffset="600"
eine andere Position.
Verschiebung der Start-Position
Mit der Eigenschaft startOffset können Sie die Startposition vom Anfang des Pfades an eine gewünschte Stelle verschieben. Dies ist besonders bei Animationen, bei denen der Text am Bildrand erscheinen soll, interessant.
Folgende Angaben sind nötig:
Längenangabe
: positive oder negative Zahl oder eines Prozentwertes.
0 entspricht dem Anfang des Pfades, 100% dem Ende.
Animation von startOffset
Mit startoffset können Sie die Start-Position des Textes an einem Text-Pfad bestimmen und auch mit SMIL animieren.
Achtung!
animate
-Elemente nicht gerendert werden.Öffnen Sie das Beispiel mit einem Klick auf Vorschau in einem neuen Tab!
<text>
<textPath class="schreib" href="#kurve" startOffset="-500">
Es geht langsam aufwärts...
<animate
attributeName="startOffset"
from="-500" to="10"
begin="3s" dur="3s"
fill="freeze"/>
</textPath>
<textPath class="schreib" href="#kurve">
... immer an der Wand lang!
<animate
attributeName="startOffset"
from="-500" to="600"
dur="5s"
fill="freeze"/>
</textPath>
</text>
<text>
<tspan role="heading" x="170" y="345">SELF</tspan>
<tspan role="heading" x="170" y="390">HTML</tspan>
<textPath class="schreib" href="#kreis" fill="var(--yellow)" startOffset="60">
erfolgreich online seit 1995!
<animate
attributeName="startOffset"
from="-375" to="175"
dur="5s"
repeatCount="indefinite"/>
</textPath>
</text>
Es werden 2 Pfade mit den ids kurve
und kreis
definiert.
Die textPath-Elemente referenzieren diese Pfade und folgen so derem Verlauf.
In diesen Beispielen wurde das startOffset-Attribut mit dem animate-Element animiert. Da das startOffset-Attribut zu Beginn einen negativen Wert hat, startet der Text im nicht sichtbaren Bereich außerhalb des Pfades und fließt mit Beginn der Animation in den sichtbaren Bereich.
Das untere Beispiel erfüllt nicht die Erwartungen, da die Animation nicht ganz rund läuft - der Text verschwindet und erscheint erst dann wieder neu. Besser wäre hier eine Rotation des Textpfades mit transform="rotate()".
Rotation mit transform
In diesem Beispiel wird der Text durch eine SVG/Transformation rotiert. Dies hat den Vorteil, dass der Übergang zwischen den Animationen glatt verläuft.
<use href="#kreis" x="10" y="62"/>
<g transform="translate(10, 62)">
<text x="0" y="0" >
<animateTransform
attributeName="transform"
type="rotate"
from="0 92 92"
to="360 92 92 "
dur="5"
repeatCount="indefinite"
/>
<textPath class="schreib" href="#kreis" fill="var(--yellow);" >
erfolgreich online seit 1995!
</textPath>
</text>
</g>
Der Pfad mit der id kreis
wird als use aufgerufen und dargestellt.
Das textPath-Element referenzieren diesen Pfad ebenfalls und wird so kreisförmig dargestellt.
Anders als im ersten Beispiel wird nicht die startOffset-Eigenschaft animiert, sondern der gesamte Textpfad mit seinem Elternelement text transformiert.
Mit dem animateTransform-Element wird der Text gedreht. Die 3 Werte im from- und to-Attribut geben Winkelmaß und Mittelpunkt der Drehung an.
Shape-Morphing eines Textpfades
Nicht nur der Text entlang des Pfades, sondern auch der Pfad selbst kann mit SMIL animiert werden:
<path id="route" d="M50,200 q100,-100 200,0 t200,0 t200,0 t200,0">
<animate attributeName="d"
values="M50,200 q100,-100 200,0 t200,0 t200,0 t200,0;
M50,200 q100,-50 200,0 t200,0 t200,0 t200,0;
M50,200 q100,-100 200,0 t200,0 t200,0 t200,0"
begin="button1.click"
dur="2s"
repeatCount="indefinite"
/>
</path>
<text>
<textPath id="offset" href="#route" startOffset="20">
Berg
<tspan style="fill:red"> und</tspan>
Talfahrt!
<animate
attributeName="startOffset"
values="20; -20; 400; 80; 800; 390; 20"
dur="9s"
begin="button3.click"
repeatCount="indefinite"
/>
</textPath>
<animate
attributeName="font-size"
values="12px;48px;12px"
dur="4s"
begin="button2.click"
repeatCount="indefinite"
/>
</text>
Der Pfad mit der id route
stellt eine regelmäßige Wellenlinie dar und dient auch als Referenzpunkt für den textPath. Bei einem Klick auf den ersten Button wird mit animate das d-Attribut mit den Pfad-Kommandos animiert.
Das text-Element enthält ebenfalls eine Animation, die die Schriftgröße animiert. Im textPath-Element wird das startOffset-Attribut animiert. Im values-Attribut sind die Werte nicht gleichmäßig fortlaufend, sodass es wirkt, als ob die Schrift für den Berg Anlauf nimmt. Die unterschiedliche Dauer der Animationen sorgt dafür, dass die Effekte zufällig wirken.
Text und Pfad erscheinen gleichzeitig
In den vorherigen Beispielen wurde der Textpfad jeweils sichtbar gemacht. Eine Alternative wäre es, den Textpfad nicht anzuzeigen, oder erst mit dem erscheinenden Text sichtbar zu machen.
In diesem Tutorial fliegen die Überschriften von links und rechts ein:
- tympanus.net: Animating SVG Text on a Path
- Terraforming (Demo)
Für das Einfliegen beim Herunterscrollen wird das scroll-Event benutzt.
In Chrome-Browsern werden Filter-Effekte animiert, die den Text erst verschwommen und dann scharf fokussiert anzeigen.
Siehe auch
- SVG/Tutorials/Einstieg/SVG mit CSS animieren Laufende Linien
Weblinks
- animated clipped textPath (mbostok) (mit D3.js)
- Text along a path (Joni Bologna)
- Tavmjong Bah: Text on a Path (or Text Warping)
interessante Effekte mit Inkscape